import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {
        Scanner num = new Scanner(System.in);
        int n = num.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = num.nextInt();
        }
        int max = maxSubArray(nums);
        System.out.println(max);
    }

    /**
     * 给你一个整数数组 nums ，请你找出一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。
     * 子数组 是数组中的一个连续部分。
     *
     * @param nums
     * @return
     */
    public static int maxSubArray(int[] nums) {
        int len = nums.length;
        //dp[i]用来表示，终点在i的子序列的最佳子序和
        int[] dp = new int[len];
        //边界条件
        dp[0] = nums[0];
        int max = dp[0];
        for (int i = 1; i < len; i++) {
            //转移公式
            dp[i] = Math.max(dp[i - 1], 0) + nums[i];
            //记录最大值
            //最后返回的值应该从dp数组中取最大值，
            // 即以i结尾的数组的最大子序和中找到最大的，作为整个数组的最佳子序和
            max = Math.max(dp[i], max);
        }
        return max;
    }
}
